import axios from 'axios';
import { ElMessage } from 'element-plus';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';

// NProgress配置
NProgress.configure({ showSpinner: false });

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL || '',
  timeout: 10000, // 请求超时时间
  withCredentials: false // 跨域请求时是否需要使用凭证
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    NProgress.start();
    
    // 可以在这里添加token等认证信息
    // config.headers['Authorization'] = 'Bearer ' + token;
    
    return config;
  },
  error => {
    // 对请求错误做些什么
    NProgress.done();
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  response => {
    NProgress.done();
    
    // 如果响应成功但业务状态不成功
    if (response.data && response.data.ActionType && response.data.ActionType !== 'ok') {
      console.warn('业务操作未成功:', response.data.message);
      // 返回降级数据而不是直接抛出错误
      return {
        data: {
          ActionType: 'ok',
          data: response.data.fallbackData || [],
          message: response.data.message || '操作已完成，但可能有部分数据不可用'
        }
      };
    }
    
    return response;
  },
  error => {
    NProgress.done();
    
    // 构建友好的错误信息
    const status = error.response?.status;
    const errorMessage = getErrorMessage(status);
    
    // 在控制台记录错误，但不显示给用户
    console.error(`API错误(${status}):`, error.message);
    
    // 为API错误提供降级响应
    return Promise.resolve({
      data: {
        ActionType: 'ok',
        data: [],
        message: `${errorMessage}，展示备用数据`,
        isUsingFallback: true
      }
    });
  }
);

// 根据HTTP状态码获取错误信息
function getErrorMessage(status) {
  const errorMessages = {
    400: '请求错误',
    401: '未授权，请重新登录',
    403: '拒绝访问',
    404: '请求地址出错',
    408: '请求超时',
    500: '服务器内部错误',
    501: '服务未实现',
    502: '网关错误',
    503: '服务不可用',
    504: '网关超时',
    505: 'HTTP版本不受支持'
  };
  
  return errorMessages[status] || `未知错误(${status})`;
}

export default service; 